package com.tywj.panda.customer.common.tool


import com.tywj.panda.customer.common.R
import com.tywj.lib.core.common.util.ResourcesUtil
import com.tywj.lib.core.common.util.TimeUtil
import org.joda.time.DateTime
import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*

/**
 * @desc 时间工具类
 * @author June Yang
 * @date 2020/5/27
 */
object TimeTool {

    /**
     * 将时间字符串转为时间戳
     */
    fun string2Millis(time: String): Long {
        return if (time.length > 10) {
            TimeUtil.string2Millis(time, TimeUtil.PATTERN_DEFAULT)
        } else {
            TimeUtil.string2Millis(time, "yyyy-MM-dd")
        }
    }

    /**
     * 将时间戳转为时间字符串
     */
    fun millis2String(millis: Long, pattern: String = TimeUtil.PATTERN_DEFAULT): String {
        // 兼容秒级时间戳
        return if (millis.toString().length < 13) {
            TimeUtil.millis2String(millis * 1000, pattern)
        } else {
            TimeUtil.millis2String(millis, pattern)
        }
    }

    /**
     * 获取显示的时间
     * 显示规则：
     *        今天：时分，例：12:30
     *        昨天：昨天，例：昨天
     *        今年：月日，例：11-30
     *        其他：年月日，例：2019-11-30
     */
    fun formatTime1(time: String): String {
        return formatTime1(string2Millis(time))
    }

    /**
     * 获取显示的时间
     * 显示规则：
     *        今天：时分，例：12:30
     *        昨天：昨天，例：昨天
     *        今年：月日，例：11-30
     *        其他：年月日，例：2019-11-30
     */
    fun formatTime1(millis: Long): String {
        val curMillis = System.currentTimeMillis()
        // 兼容秒级时间戳
        val showMillis: Long = if (millis.toString().length < 13) millis * 1000 else millis

        val date = DateTime(showMillis)
        val curDate = DateTime(curMillis)

        if (date.year == curDate.year) {
            return if (curDate.monthOfYear == date.monthOfYear && curDate.dayOfMonth() == date.dayOfMonth()) {
                // 今天
                TimeUtil.millis2String(showMillis, "HH:mm")
            } else {
                val minusDate = curDate.minusDays(1)
                if (minusDate.monthOfYear == date.monthOfYear && minusDate.dayOfMonth() == date.dayOfMonth()) {
                    // 昨天
                    ResourcesUtil.getString(R.string.common_time_yesterday)
                } else {
                    // 同年其他天
                    TimeUtil.millis2String(showMillis, "MM-dd")
                }
            }
        } else {
            // 不是同一年
            return TimeUtil.millis2String(showMillis, "yyyy-MM-dd")
        }
    }

    /**
     * 格式化时间
     * 显示规则：
     *        今年：月日时分，例：11-30 12:30
     *        其他：年月日，例：2019-11-30
     */
    fun formatTime2(time: String): String {
        return formatTime2(string2Millis(time))
    }

    /**
     * 格式化时间
     * 显示规则：
     *        今年：月日时分，例：11-30 12:30
     *        其他：年月日，例：2019-11-30
     */
    fun formatTime2(millis: Long): String {
        val curMillis = System.currentTimeMillis()
        // 兼容秒级时间戳
        val showMillis: Long = if (millis.toString().length < 13) millis * 1000 else millis

        val date = DateTime(showMillis)
        val curDate = DateTime(curMillis)

        return if (date.year == curDate.year) {
            TimeUtil.millis2String(showMillis, "MM-dd HH:mm")
        } else {
            // 不是同一年
            TimeUtil.millis2String(showMillis, "yyyy-MM-dd")
        }
    }

    /**
     * 格式化时间
     * 显示规则：
     *        今年：月日，例：11-30
     *        其他：年月日，例：2019-11-30
     */
    fun formatTime3(time: String): String {
        return formatTime3(string2Millis(time))
    }

    /**
     * 格式化时间
     * 显示规则：
     *        今年：月日，例：11-30
     *        其他：年月日，例：2019-11-30
     */
    fun formatTime3(millis: Long): String {
        val curMillis = System.currentTimeMillis()
        // 兼容秒级时间戳
        val showMillis: Long = if (millis.toString().length < 13) millis * 1000 else millis

        val date = DateTime(showMillis)
        val curDate = DateTime(curMillis)

        return if (date.year == curDate.year) {
            TimeUtil.millis2String(showMillis, "MM-dd")
        } else {
            // 不是同一年
            TimeUtil.millis2String(showMillis, "yyyy-MM-dd")
        }
    }

    /**
     * @param oldTime 旧时间
     * @param addMit 添加的分钟数 6：30 +5分钟 = 6：35
     * @return 转换成功则返回相应的数据，失败则原时间
     * 注意大写为 24小时格式为 ("HH :mm")  12小时格式小写为（"hh:mm"）
     */
    fun formatTimeAdd(oldTime: String, addMit: String): String {
        val df: DateFormat = SimpleDateFormat("HH:mm", Locale.CHINA)
        var date: Date? = null
        var expireTime: Date? = null
        try {
            date = df.parse(oldTime)
            expireTime = Date(date.time + addMit.toInt() * 60 * 1000)
            return df.format(expireTime)
        } catch (e: ParseException) {
            e.printStackTrace()
            return oldTime
        }
    }

    /**
     * 判断是否是今天
     * 对比数据：日历中的静态数据和当前的系统时间对比
     */
    fun isToDay(date: Date): Boolean {
        val dateNow = Calendar.getInstance()
        //得到 格式类似于2020-04-31
        val year = dateNow.get(Calendar.YEAR).toString()

        val month =
            String.format(ResourcesUtil.getString(R.string.common_month), dateNow.get(Calendar.MONTH) + 1) //必须要+1
        val day = String.format(ResourcesUtil.getString(R.string.common_day), dateNow.get(Calendar.DATE))

        val ymd = TimeUtil.millis2String(date.time, TimeUtil.PATTERN_FORMAT)
        val strYearMonthDay = ymd.split("-")
        if (year == strYearMonthDay[0] && month == strYearMonthDay[1] && day == strYearMonthDay[2]) {
            return true
        }
        return false
    }
}